package caclTest;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class App extends Frame implements ActionListener, WindowListener
{
	private Container container;
	private GridBagLayout layout;
	private GridBagConstraints constraints; 
	private JTextField displayField;         //计算结果显示区
	private String lastCommand;           //保存+,-,*,/,=命令0
	private double result;               //保存计算结果
	private boolean start;           //判断是否为数字的开始
	private JMenuBar menubar;
	private JMenuItem m_exit;
	private JMenuItem m2_ejz;
	private JMenuItem m2_bjz;
	private Dialog dialog;
    private Label label_dialog;
	private JButton button_sqrt;
	private JButton button_plusminus;
	private JButton button_CE;
	private JButton button_cancel;
	private JButton button_1;
	private JButton button_2;
	private JButton button_3;
	private JButton button_4;
	private JButton button_5;
	private JButton button_6;
	private JButton button_7;
	private JButton button_8;
	private JButton button_9;
	private JButton button_0;
	private JButton button_plus;
	private JButton button_minus;
	private JButton button_multiply;
	private JButton button_divide;
	private JButton button_point;
	private JButton button_equal;
	private JButton button_log;
	private JButton button_tan;
	private JButton button_cos;
	private JButton button_sin;
	private JButton button_exp;
	
	public App()       //构造方法设置布局、为按钮注册事件监听器
	{
		super( "My Calculator" );
		this.setLocation( 350,150 );
		this.setSize( 450,400 );
		this.setResizable( true );
		this.setLayout( new GridLayout( 7,1 ) );
		this.addmyMenu();                   //调用成员方法添加菜单
		displayField = new JTextField( 30 );
		this.add( displayField );
		displayField.setEditable( true );

		start = true;
		result = 0;
		lastCommand = "=";

        JPanel panel0 = new JPanel();
		panel0.setLayout( new GridLayout( 1,4,4,4 ) );
	    
		
		JPanel panel1 = new JPanel();
		panel1.setLayout( new GridLayout( 1,5,4,4 ) );
		this.add( panel1 );
        button_sqrt = new JButton( "sqrt" );//根号
		button_plusminus = new JButton( "%" );
		button_exp = new JButton( "exp" );//底数e的n次幂
		button_CE = new JButton( "退位");
		button_cancel = new JButton( "c" );//清除

		JPanel panel2 = new  JPanel();
		panel2.setLayout( new GridLayout( 1,5,4,4 ) );
		this.add( panel2 );
		button_7 = new JButton( "7" );
		button_8 = new JButton( "8" );
		button_9 = new JButton( "9" );
		button_log = new JButton( "log" );//对数
		button_divide = new JButton( "/" );//除

        JPanel panel3 = new JPanel();
		panel3.setLayout( new GridLayout(1,5,4,4) );
		this.add( panel3 );
		button_4 = new JButton( "4" );
		button_5 = new JButton( "5" );
		button_6 = new JButton( "6" );
		button_tan = new JButton( "tan" );//正切
		button_multiply = new JButton( "*" );//乘法

        JPanel panel4=new  JPanel();
		panel4.setLayout( new GridLayout( 1,5,4,4 ) );
		this.add(panel4);
		button_1 = new JButton( "1" );
		button_2 = new JButton( "2" );
		button_3 = new JButton( "3" );
		button_cos = new JButton( "cos");//余弦
		button_minus = new JButton( "-" );

        JPanel panel5 = new  JPanel();
		panel5.setLayout( new GridLayout( 1,5,4,4 ) );
		this.add( panel5 ); 
		button_0 = new JButton( "0" );
		button_point=new JButton( "." );
		button_equal = new JButton( "=" );
		button_sin = new JButton( "sin" );//正弦
		button_plus = new JButton( "+" );

		panel1.add( button_sqrt );
		panel1.add( button_plusminus );
		panel1.add( button_exp );
		panel1.add( button_CE );
		panel1.add( button_cancel );
        panel2.add( button_7 );
		panel2.add( button_8 );
		panel2.add( button_9 );
		panel2.add( button_log );
        panel2.add( button_divide );
		panel3.add( button_4 );
		panel3.add( button_5 );
		panel3.add( button_6 );
		panel3.add( button_tan );
		panel3.add( button_multiply );
		panel4.add( button_1 );
        panel4.add( button_2 ); 
        panel4.add( button_3 );
		panel4.add( button_cos );
        panel4.add( button_minus );
        panel5.add( button_0 );
        panel5.add( button_point );
        panel5.add( button_equal );
		panel5.add( button_sin );
        panel5.add( button_plus) ;

		button_sqrt.addActionListener( this );
		button_plusminus.addActionListener( this );
		button_exp.addActionListener( this );
		button_CE.addActionListener( this );
		button_cancel.addActionListener( this );
		button_7.addActionListener( this );
		button_8.addActionListener( this );
		button_9.addActionListener( this );
		button_log.addActionListener( this );
		button_divide.addActionListener( this );
		button_4.addActionListener( this );
		button_5.addActionListener( this );
		button_6.addActionListener( this );
		button_tan.addActionListener( this );
		button_multiply.addActionListener( this );
		button_1.addActionListener( this );
		button_2.addActionListener( this );
		button_3.addActionListener( this );
		button_cos.addActionListener( this );
		button_minus.addActionListener( this );
		button_0.addActionListener( this );
		button_point.addActionListener( this );
		button_equal.addActionListener( this );
		button_sin.addActionListener( this );
		button_plus.addActionListener( this );
				
		this.addWindowListener( new WinClose() );      //注册窗口监听器
		this.setVisible( true );
	}
	
	private void addmyMenu()		//菜单的添加
	{	
		JMenuBar menubar = new JMenuBar(); 
		this.add( menubar );
		JMenu m1 = new JMenu( "选项" );
		JMenu m2 = new JMenu( "进制转换" );

		JMenuItem m1_exit = new JMenuItem( "退出" );
		m1_exit.addActionListener( this );
		JMenuItem m2_ejz = new JMenuItem( "二进制" );
		m2_ejz.addActionListener( this );
		JMenuItem m2_bjz = new JMenuItem("八进制");
		m2_bjz.addActionListener( this );
		JMenuItem m2_sljz = new JMenuItem("十六进制");
		m2_sljz.addActionListener( this );
		JMenuItem m2_dao_shu = new JMenuItem("倒数");
		m2_dao_shu.addActionListener( this );

		JMenu m3 = new JMenu( "帮助" ); 
 		JMenuItem m3_Help = new JMenuItem( "用法" ); 
		m3_Help.addActionListener( this ); 

		dialog = new Dialog( this, "提示" , true );     //模式窗口
        dialog.setSize( 240,80 );
        label_dialog = new Label("", Label.CENTER );   //标签的字符串为空，居中对齐
        dialog.add( label_dialog ); 
        dialog.addWindowListener( this );          //为对话框注册窗口事件监听器
		
		m1.add( m1_exit );	
		menubar.add( m1 );
		m2.add( m2_ejz );
		m2.add( m2_bjz );
		m2.add( m2_sljz );
		m2.add( m2_dao_shu );
		
		menubar.add( m2 );
		m3.add( m3_Help ); 
		menubar.add( m3 );	
	}

	public void actionPerformed(ActionEvent e)       //按钮的单击事件处理方法
	{
		if(
				e.getSource().equals( button_1 )||e.getSource().equals( button_2 )|| 
				e.getSource().equals( button_3 )||e.getSource().equals( button_4 )||
				e.getSource().equals( button_5 )|| e.getSource().equals( button_6 )||
				e.getSource().equals( button_7 )|| e.getSource().equals( button_8 )||
				e.getSource().equals( button_9 ) ||e.getSource().equals( button_0 )||
				e.getSource().equals( button_point )||	
				e.getSource().equals( button_cancel )||e.getSource().equals( button_CE )
		  )
		{      //非运算符的处理方法
			String input = e.getActionCommand();
			
			if ( start )
			{
				displayField.setText("");
				start = false;
				if( input.equals( "+/-" ) )
					displayField.setText( displayField.getText()+ "-" ); 
			}
			if( !input.equals( "+/-" ) )
			{
				String str = displayField.getText();
				if( input.equals( "退位" ) )          //退格键的实现方法
				{		
					if( str.length() > 0 )
						displayField.setText( str.substring( 0,str.length() - 1 ) );
				}
				else if( input.equals( "c" ) )         //清零键的实现方法
				{
					displayField.setText( "" );
					start = true;
				} 	
				else
					displayField.setText( displayField.getText() + input );
			}
		}
		else if ( e.getActionCommand() == "二进制" )   //二进制的转换
		{
			int n = Integer.parseInt( displayField.getText() );
			displayField.setText( Integer.toBinaryString( n ) );
		}
        else if ( e.getActionCommand() == "八进制" )    //八进制的转换
		{
			int n = Integer.parseInt( displayField.getText() );
			displayField.setText( Integer.toOctalString( n ) ); 	
		}
		else if ( e.getActionCommand() == "十六进制" )    //十六进制的转换
		{
			int n = Integer.parseInt( displayField.getText() );
			displayField.setText( Integer.toHexString( n ) );
		}
		
		else if ( e.getActionCommand() == "倒数" )    //倒数
		{
			Double n = Double.parseDouble( displayField.getText() );
			displayField.setText(String.valueOf( 1/n ));
		}

		else if ( e.getActionCommand() == "退出" )      //选项中退出的处理方法
		{
			System.exit( 0 );
		}
		else if ( e.getActionCommand() == "用法" )      //按下'帮助'菜单栏中用法的处理方法
		{	
			//label_dialog.setText( "sqrt,exp等键是先输运算符再输数字\n" ); 
			label_dialog.setText( "" );
            dialog.setLocation( 400,250 );
            dialog.setVisible( true );	
		}
		else//各运算符的识别
		{
			String command = e.getActionCommand();
			if( start )
			{
				lastCommand = command;
			}
			else
			{
				calculate( Double.parseDouble( displayField.getText() ) );
				lastCommand = command;
				start = true;
			}
		 }
	}
	
	public void calculate( double x )          //各运算符的具体运算方法
    {
		double d = 0;
		if ( lastCommand.equals( "+" ) ) 
			result += x;    
		else if (lastCommand.equals( "-" ) ) 
			result -= x;
		else if ( lastCommand.equals( "*" ) ) 
			result *= x;   
		else if ( lastCommand.equals( "/" ) ) 
			result /= x;
		else if ( lastCommand.equals( "%" ) ) 
			result %= x;
		else if ( lastCommand.equals( "=" ) ) 
			result = x;
        else if ( lastCommand.equals( "sqrt" ) ) 
		{
			d = Math.sqrt( x );
			result = d;
		}
		else if ( lastCommand.equals( "exp" ) )
		{
			d = Math.exp( x );
			result = d;
		}
		else if ( lastCommand.equals( "log" ) )
		{
			d = Math.log( x );
			result = d;
		}
		else if ( lastCommand.equals( "tan" ) )
		{
			d = Math.tan(x);
			result = d;
		}
		else if ( lastCommand.equals( "cos" ) )
		{
			d = Math.cos( x );
			result = d;
		}
		else if ( lastCommand.equals( "sin" ) )
		{
			d = Math.sin( x );
			result = d;
		}
		displayField.setText( ""+ result );
     }	 
	
	public void windowClosing( WindowEvent e )
    {
        if( e.getSource() == dialog )
            dialog.setVisible( false );           //隐藏对话框
        else
            System.exit( 0 ); 
    }

    public void windowOpened( WindowEvent e )         {  }
    public void windowActivated( WindowEvent e )      {  }
    public void windowDeactivated( WindowEvent e )    {  }
    public void windowClosed( WindowEvent e )         {  }
    public void windowIconified( WindowEvent e )      {  }
    public void windowDeiconified( WindowEvent e )    {  }
		
	public static void main( String args[] )          
	{
		App calculator = new App();
	}
}

class WinClose implements WindowListener
{
	public void windowClosing( WindowEvent e )    //单击窗口关闭按钮时触发并执行实现窗口监听器接口中的方法
	{
		System.exit( 0 );          //结束程序运行
	}
	public void windowOpened( WindowEvent e ){ }
	public void windowActivated( WindowEvent e ){}
	public void windowDeactivated( WindowEvent e){ }
	public void windowClosed( WindowEvent e ){ }
	public void windowIconified( WindowEvent e ){ }
	public void windowDeiconified( WindowEvent e ){ }
}